#ifndef DBCPARSE_PUBLICDEFINE_H
#define DBCPARSE_PUBLICDEFINE_H


/* 参数检查开关宏定义 */
// #define PARAMETER_CHECK	
#define CANSIGNAL_PHYVAL_MAXMIN_CHECK



/* 数据类型宏定义 */
#ifndef float32
#define float32		float
#endif

#ifndef float64
#define float64		double
#endif

#ifndef uint8
#define uint8		unsigned char
#endif

#ifndef uint16
#define uint16		unsigned short
#endif

#ifndef uint32
#define uint32		unsigned int
#endif

#ifndef uint64
#define uint64		unsigned long long int
#endif

#ifndef sint8
#define sint8		signed char
#endif

#ifndef sint16
#define sint16		signed short
#endif

#ifndef sint32
#define sint32		signed int
#endif

#ifndef sint64
#define sint64		signed long long int

#ifndef False
#define False		(0u)
#endif

#ifndef True
#define True		(1u)
#endif

#endif


typedef enum
{
	RET_OK = 0u,
	RET_INIT_ERR,
	RET_DATATYPE_ERR,
	RET_SIGPHYVAL_EXCEED_MAXMIN,
}eRETVALUE;

typedef enum
{
	SIGPHYDATATYPE_UINT8 = 0u,
	SIGPHYDATATYPE_UINT16,
	SIGPHYDATATYPE_UINT32,
	SIGPHYDATATYPE_UINT64,
	SIGPHYDATATYPE_SINT8,
	SIGPHYDATATYPE_SINT16,
	SIGPHYDATATYPE_SINT32,
	SIGPHYDATATYPE_SINT64,
	SIGPHYDATATYPE_FLOAT
}esIGPHYDATATYPE;

typedef enum
{
	SIGRAWDATATYPE_UNSIGNED = 0u,
	SIGRAWDATATYPE_SIGNED
}eSIGRAWDATATYPE;

typedef enum
{
	SIGFACTOROFFSETDATATYPE_FLOAT = 0u,
	SIGFACTOROFFSETDATATYPE_INTPOSITIVE,
	SIGFACTOROFFSETDATATYPE_INTNEGATIVE,
}eFACTOROFFSETDATATYPE;

typedef enum
{
	SIGBYTEENDIAN_MOTOROLAR = 0u,
	SIGBYTEENDIAN_INTEL
}eSIGBYTEENDIAN;

typedef struct CanSignalConfig
{
	uint8 dataType;		/* 信号物理值数据类型 */

	uint8 rawDataType;	/* 信号在CAN报文中的原始数据类型: signed/unsigned */

	uint8 dataEndian;	/* 信号数据格式：motorolar/intel */

	uint8 factorDataType;	/* 分辨率数据类型 */
	double factorVal;	/* 分辨率数据，存储为float64格式 */

	uint8 offsetDataType;	/* 偏移量数据类型 */
	double offsetVal;	/* 偏移量数据，存储为float64格式 */
	
	uint32  startBit;	/* 信号起始位 */

	uint32  lengthBits;		/* 信号长度 */

	uint8 isMultiplexor;	/* 暂不支持 Multiplexor 模式 */

	uint8 maxminumValid;	/* 信号最大值有效性 */
	double maximum;		/* 信号最大值 */

	uint8 minimumValid;	/* 信号最大值有效性 */
	double minimum;		/* 信号最小值 */
}tCANSIGNALCONFIG;



extern uint8 dbcParse_CanSignalDecode(const tCANSIGNALCONFIG *canSigConfig, const uint8 const *pCanRawData, void *pData);
extern uint8 dbcParse_CanSignalEncode(const tCANSIGNALCONFIG *canSigConfig, uint8 *pCanRawData, void *pData);


#endif
